package com.leyou.search.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品索引库文档对象
 * 注意：ES的一个Goods对象对应MySQL一个Spu对象
 */
@Data
@Document(indexName = "goods",type = "docs",shards = 3,replicas = 1)
public class Goods {
   @Id
   @Field(type = FieldType.Keyword)
   private Long id;//文档ID，spuId

   @Field(type = FieldType.Text,analyzer = "ik_max_word")
   private String spuName;//注意：因为spuName需要进行高亮显示的，所以该字段进行分词和指定分词器

   @Field(type = FieldType.Keyword,index = false)
   private String subTitle; //因为all字段已经包含了subTitle，所以该字段不参与搜索，也就不用索引和分词了！

   @Field(type = FieldType.Text,analyzer = "ik_max_word")
   private String all; // all： 封装了所有参与搜索的条件   例如：spu的name和subTitle，所有Sku的title

   @Field(type = FieldType.Keyword,index = false)
   private String skus;//注意：因为把所有SKu的title和price抽取出来了，其他字段可以不参与搜素，整个skus字段都可以不索引，不分词啦！

   @Field(type = FieldType.Keyword)
   private Long categoryId;//产品的分类，搜索页面的分类列表是通过聚合而来的
   @Field(type = FieldType.Keyword)
   private Long brandId;//产品的品牌，展示品牌列表的时候，通过聚合的方法展示品牌列表的

   /**
    * 格式：
    *  {
    *      "CPU品牌":"骁龙"
    *      "CPU核数":"4核"
    *      ....
    *  }
    *
    *  上面的格式中
    *     key: 来源于规格参数表名称(tb_spec_param的name字段)
    *     value：来源于Spu详情表的通用或特有参数字段（tb_spu_detail的generic_spec或special_spec）
    *
    */
   @Field(type = FieldType.Object)
   private Map<String,Object> specs;//产品的所有用于搜索的规格参数，所有参数参与搜索，所以要索引

   @Field(type = FieldType.Long)
   private Set<Long> price;//所有Sku的价格，默认索引

   @Field(type = FieldType.Long)
   private Long createTime;//创建时间
}
